//*assume each node has ptr to parent
struct Node {
	Node() : parent(0),left(0),right(0),visited(false) {}
	Node *parent, *left, *right;
	int key; 
	bool visited;
};

void inorder_traverse_recursive(Node *root);

void inorder_traverse_iterative(Node *root);
void inorder_traverse_iterative2(Node *root);

void inorder_traverse_with_stack(Node* root);

void inorder_travers_with_stack_without_visit(Node* root) ;

void postorder_traversal_recursive(Node * n);
void postorder_traversal_stack(Node * n );
void postorder_traversal_parent(Node * root);
void postorder_reverse_preorder(Node* root);

void preorder_recursive(Node *n );
void preorder_stack(Node * root);
void preorder_parent(Node* root);